home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cgazv5n5.arc / XMSEMB.C < prev    next >
C/C++ Source or Header  |  1991-09-23  |  3KB  |  75 lines

  1. /*--- XMSEMB.C --------------------------- Listing 5 ------
  2.  * XMS UMB Functions. Prints greeting from extended memory.
  3.  * by David Babcock
  4.  *
  5.  * Must be linked with XMSGEN (Listing 1)
  6.  *
  7.  * Validated for Microsoft and Borland C/C++
  8.  *
  9.  * (c) 1991 C Gazette. Object Code may be used freely,
  10.  * source code may be used if authorship and publication
  11.  * are acknowledged.
  12.  *-------------------------------------------------------*/
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16. #include <string.h>
  17.  
  18. #include "xms.h"
  19.  
  20. static char hello[] = "hello from extended memory" ;
  21. static char hello_again [ 30 ] ;
  22.  
  23. void main ( void )
  24. {
  25.     unsigned int ver ;
  26.     unsigned int largestBlock ;
  27.     int          allocResult ;
  28.     unsigned int handle ;
  29.  
  30.     ver = ( unsigned int ) GetXMSVersionNumber ( ) ;
  31.     printf ( "XMS version %s\n",
  32.               PrintXMSVersionNumber ( ver ) ) ;
  33.  
  34.     if ( ver >= 0x200 )
  35.     {
  36.         largestBlock = QueryFreeExtendedMemory() & 0xFFFF ;
  37.         printf ( "Largest free extended memory block:\n%uK\n",
  38.                   largestBlock ) ;
  39.         if ( largestBlock > 0 )
  40.         {
  41.             allocResult =
  42.              ( AllocateExtendedMemoryBlock(largestBlock) == 0 );
  43.             handle = xms_struc.ret_dx ;
  44.             if ( allocResult )
  45.             {
  46.                 /* copy from conventional memory to the EMB */
  47.                 XMSMoveStruct.Length =
  48.                  (( strlen ( hello ) + 1 ) + 1 )
  49.                         & ~1L ; /* round up */
  50.                 XMSMoveStruct.SourceHandle = 0 ;
  51.                 XMSMoveStruct.SourceOffset.p =
  52.                         ( void far * ) hello ;
  53.                 XMSMoveStruct.DestHandle = handle ;
  54.                 XMSMoveStruct.DestOffset.o = 0 ;
  55.                 MoveExtendedMemoryBlock
  56.                         (( void far * ) &XMSMoveStruct ) ;
  57.  
  58.                 /* now copy from EMB to conventional memory */
  59.                 XMSMoveStruct.Length =
  60.                  (( strlen ( hello ) + 1 ) + 1 )
  61.                         & ~1L ; /* round up */
  62.                 XMSMoveStruct.SourceHandle = handle ;
  63.                 XMSMoveStruct.SourceOffset.o = 0 ;
  64.                 XMSMoveStruct.DestHandle = 0 ;
  65.                 XMSMoveStruct.DestOffset.p =
  66.                         ( void far * ) hello_again ;
  67.                 MoveExtendedMemoryBlock
  68.                         (( void far * ) &XMSMoveStruct ) ;
  69.  
  70.                 printf ( "%s\n", hello_again ) ;
  71.                 FreeExtendedMemoryBlock ( handle ) ;
  72.             }
  73.         }
  74.     }
  75. }